home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / COMP / PATCH43C.M < prev    next >
Encoding:
Text File  |  1994-06-03  |  2.7 KB  |  85 lines

  1. MODULE MM2Comp43C_Patch;
  2. (*
  3.  * Patch-Programm für Megamax Modula-2 zum Compiler 4.3c.
  4.  *
  5.  * Dieses Programm korrigiert einen Fehler im Compiler 4.3c:
  6.  *  Bei Verwendung von verschachtelten Value-Constructors
  7.  *  meldet der Compiler u.U. einen internen Fehler, während
  8.  *  ältere Versionen hier kein Problem hatten.
  9.  *
  10.  * Im Compiler muß lediglich das Wort auf Offset $43EA in
  11.  * "MM2COMP.IMP" von $670A auf $670C geändert werden.
  12.  * Das erledigt dieses Programm für diejenigen, die es nicht
  13.  * mit einem Binärdatei-Editor manuell erledigen wollen.
  14.  * Einfach dieses Programm übersetzen und von der Shell aus
  15.  * starten. Es sucht den Compiler in den von der Shell ver-
  16.  * wendeten Suchpfaden und korrigiert das File "MM2COMP.IMP"
  17.  * entsprechend.
  18.  *
  19.  * Die korrigierte Version erhält die Versionsnr. 4.3d
  20.  *)
  21.  
  22. FROM SYSTEM IMPORT ADR;
  23. FROM Paths IMPORT ListPos, SearchFile;
  24. FROM ShellMsg IMPORT CompilerParm, ShellPath, StdPaths;
  25. FROM Strings IMPORT String, Assign;
  26. FROM InOut IMPORT WriteString, WriteLn, Read;
  27. FROM Files IMPORT Open, Close, Access, File;
  28. FROM Binary IMPORT ReadBytes, WriteBytes, FileSize, Seek, SeekMode;
  29. FROM PathEnv IMPORT HomePath;
  30.  
  31.  
  32. CONST len = 79590;
  33.       ofs = $43EA;
  34.       ver = $1F1C;
  35.  
  36. VAR buf: ARRAY [0..40000] OF CARDINAL;
  37.     found: BOOLEAN;
  38.     name: ARRAY [0..132] OF CHAR;
  39.     l: LONGCARD;
  40.     f: File;
  41.  
  42. PROCEDURE wait;
  43.   VAR c: CHAR;
  44.   BEGIN
  45.     WriteLn; WriteString ("Taste..."); Read (c);
  46.     Close (f);
  47.   END wait;
  48.  
  49. BEGIN
  50.   HomePath:= ShellPath; (* um die "*" richtig zu interpretieren *)
  51.   SearchFile (CompilerParm.name (* oder: "MM2COMP.IMP" *),
  52.               StdPaths, fromStart, found, name);
  53.   IF ~found THEN
  54.     WriteString ('"'); WriteString (CompilerParm.name);
  55.     WriteString ('" ist nicht zu finden!');
  56.     wait; RETURN;
  57.   END;
  58.   Open (f, name, readWrite);
  59.   IF FileSize (f) # len THEN
  60.     WriteString ('"'); WriteString (name);
  61.     WriteString ('" hat falsche Länge - ist es wirklich V4.3c?');
  62.     wait; RETURN;
  63.   END;
  64.   ReadBytes (f, ADR (buf), len, l);
  65.   IF l # len THEN HALT (* nanu? *) END;
  66.   IF buf[ofs DIV 2] = $670C THEN
  67.     WriteString ('"'); WriteString (name);
  68.     WriteString ('" ist bereits gepatcht.');
  69.     wait; RETURN;
  70.   END;
  71.   IF (buf[ofs DIV 2] # $670A) OR (buf[ver DIV 2] # $6300) THEN
  72.     WriteString ('"'); WriteString (name);
  73.     WriteString ('" scheint nicht V4.3c zu sein!');
  74.     wait; RETURN;
  75.   END;
  76.   buf[ofs DIV 2]:= $670C;  (* Dies ist der notwendige Patch *)
  77.   buf[ver DIV 2]:= $6400;  (* Versionsnr. auf 4.3d ändern *)
  78.   Seek (f, 0, fromBegin);
  79.   WriteBytes (f, ADR (buf), len);
  80.   Close (f);
  81.   WriteString ('"'); WriteString (name);
  82.   WriteString ('" wurde erfolgreich gepatcht.');
  83.   wait;
  84. END MM2Comp43C_Patch.
  85.